package com.bt7274.service;

import com.bt7274.pojo.User;
import com.bt7274.pojo.bo.*;
import com.bt7274.pojo.vo.PageResult;
import com.bt7274.pojo.vo.UserExpVO;
import com.bt7274.pojo.vo.UserInfoVO;

public interface UserService {
    /**
     * @Description 创建跟新用户基本信息
     * @Author hp 
     * @param userBO 
     */
    public void createOrUpdate(UserBO userBO);

    /**
     * 用户注册
     *
     * @param userRegisterBO 注册信息
     * @return 注册成功的用户信息
     */
    UserInfoVO register(UserRegisterBO userRegisterBO);

    String generatePasskey(String userId);

    /**
     * 用户登录
     *
     * @param userLoginBO 登录信息
     * @return 登录成功的用户信息
     */
    UserInfoVO login(UserLoginBO userLoginBO);

    /**
     * 验证密码
     *
     * @param user 用户实体
     * @param password 待验证的密码
     * @return 是否匹配
     */
    boolean verifyPassword(User user, String password);

    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    UserInfoVO getUserInfo(String userId);

    /**
     * 根据用户ID获取用户经验数据
     *
     * @param userId 用户ID
     * @return 用户体验数据
     */
    UserExpVO getUserExp(String userId);

    /**
     * 根据用户名或邮箱获取用户
     *
     * @param usernameOrEmail 用户名或邮箱
     * @return 用户实体
     */
    User findByUsernameOrEmail(String usernameOrEmail);

    /**
     * 检查用户名是否已存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 检查邮箱是否已存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 更新用户权限组
     *
     * @param userId 用户ID
     * @param permissionGroup 权限组
     * @return 是否成功
     */
    boolean updatePermissionGroup(String userId, Integer permissionGroup);

    /**
     * 更新用户密码
     *
     * @param userProfileUpdateBO 新用户信息
     * @return 是否成功
     */
    boolean updatePassword(UserProfileUpdateBO userProfileUpdateBO);

    /**
     * 更新用户状态
     *
     * @param userId 用户ID
     * @param status 用户状态
     * @return 是否成功
     */
    boolean updateStatus(String userId, Integer status);

    /**
     * 封禁用户
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean banUser(String userId);

    /**
     * 解封用户
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean unbanUser(String userId);

    /**
     * 更新用户基本信息
     *
     * @param userProfileBO:
     * @return UserInfoVO
     * @author galland
     */
    UserInfoVO updateUserProfile(UserProfileBO userProfileBO);

    PageResult<UserInfoVO> queryUserList(UserQueryParam param);

    String getPasskeyById(String id);

    User getUserById(String id);

    User getUserByPasskey(String passkey);

    /**
     * 计算用户的上传促销偏移量
     * @param userId 用户 ID
     * @param lastDownload 上次下载量
     * @return 上传促销偏移量
     */
    long calculatePromotionUploadOffset(String userId, long lastDownload);

    /**
     * 计算用户的下载促销偏移量
     * @param userId 用户 ID
     * @param lastUploaded 上次上传量
     * @return 下载促销偏移量
     */
    long calculatePromotionDownloadOffset(String userId, long lastUploaded);
}
